/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.ptc.gco.dao;

import edu.ucue.ptc.gco.mdl.Lote;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import javax.ejb.Stateless;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * @author edwin
 */
@Stateless
@Named(value = "loteDao")
public class LoteDAO implements LoteDAOLocal {

    @PersistenceContext(unitName = "edu.ucue.gped_gestionpedidosee-ejb_ejb_1.0-SNAPSHOTPU")
    private EntityManager entityManager;

    @Override
    public void crear(Lote lote) {
        entityManager.persist(lote);
    }

    @Override
    public void actualizar(Lote lote) {
        entityManager.merge(lote);
    }

    @Override
    public void eliminar(Lote lote) {
        entityManager.remove(lote);
    }

    @Override
    public List<Lote> listarTodos() {
        Query query = entityManager.createQuery("select l from Lote l");
        return query.getResultList();
    }

    @Override
    public Lote obtenerPorId(int idLote) {
        return entityManager.find(Lote.class, idLote);
    }

    @Override
    public List findLoteWhere(String consulta, HashMap<String, Object> parametros) {
        Query query = entityManager.createQuery(consulta);
        //query.setp

        for (Entry<String, Object> entry : parametros.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();

            query.setParameter(key, value);
        }
        return query.getResultList();
    }

    @Override
    public List<Lote> lotes(Date fechaActual) {
        HashMap<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("fechaActual", fechaActual);
        return findLoteWhere("select o from Lote o where o.fechaCaducidad >= :fechaActual and o.cantidadActual > 0 order by o.cantidadActual ", parametros);
    }

    @Override
    public Long totalStock(int idProducto, Date fechaActual) {
            HashMap<String, Object> parametros = new HashMap<String, Object>();
            parametros.put("idProd", idProducto);
            parametros.put("fechaActual", fechaActual);

            List obj = findLoteWhere("select sum(o.cantidadActual) from Lote o where o.producto.idProducto = :idProd and o.fechaCaducidad > :fechaActual ", parametros);
            if (obj != null) {
                Long resultado = (Long) obj.get(0);
                if (resultado == null) {
                    return 0L;
                } else {
                    return resultado;
                }
            }
            return 0L;
    }
}
